# 类
# 语法
class Clasname:
    pass

# 类  ： 一个抽象的概念 ， 对于某一种事务的概括
# 对象 实例  ---》 类事务中e的个体
# 从语法来讲 ： 对象是由类生成的

c = Clasname()  #   根据类创建一个对象（实例）  实例化 -- 》  instance
print(type(c))      # <class '__main__.Clasname'>



# 类中有属性  和  方法
# 某一类事物  有 属性  和  行为
#         n 描述   v 描述


# 属性：  类属性                    实例属性
#        所有对象成员都一样         not all

# 方法：
# 类方法 @ classmethod        执有cls对象，cls中可以获取类属性
#  如果方法中用到了类属性， 你  可以  将这个方法写出类方法
#  根据需求分析是否写出类方法  --》 全体成员都一致

# 实例方法  def (self,p)
# 执有self对象，self中可以获取对象的属性  self 代表实例化之后的对象

# 静态方法 @ staticmethod
#  就是个函数 ， 写在了类中

#对象.实例属性
# 对象.实例方法

# 类名.类属性
# 类名.类方法

# 对象.静态方法
# 类名.静态方法
# 当没有实例时，对象 没有对应的  属性和 方法的时候  --》 去类查找
class Boy():
    count = 10  # 类属性

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def play(self):
        print('{}:{}'.format(self.name,self.age))

    @classmethod
    def showcount(cls):
        print('一共有{}boy'.format(cls.count))

    @staticmethod
    def show():
        print('学生借书')
# 方法是 “执有了对象之后 ” 的函数

b = Boy('梨花香',8)
print(b.name)
print(b.age)
b.play()
b.show()

print(Boy.count)
print(b.count)

# 当实例方法与类方法重合时，
# 后面的方法会把上面的方法覆盖掉

# 如果起的名字不一样，
# 对象可调用 类方法


#  OOP  面向对象编程
# Object Oriented Programming
# 一切皆对象
# 面向对象编程三大特征： 封装，继承，多态  ---》 类

# class A(class1,class2):  #  支持多重继承，但是 要注意继承顺序，别乱继承
# 多态  --》  鸭子模式

# 调用一个方法 ， 方法中有多个参数，参数 A(B)，只要B中有你想要的属性或方法,/A的子类也 ok

class Smallboy(Boy):
    pass
class Oldboy(Boy):
    pass

s = Smallboy('小男孩',3)
o = Oldboy('老男孩',39)

class A:
    def fun1(boy):
        boy.showcount()

# fun1(b)
# fun1(s)
# fun1(o)
#
# fun1(A())  鸭子模式

# 私有属性
from datetime import datetime
# 特性：特俗的属性，把一个方法改造成了属性
# 当成属性来用
# 对属性做出限制

















